package com.lanou3g.code0514;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.*;

/**
 * Created by dllo on 18/5/14.
 */
/*
今日课程总结:
1.label标签常和input标签一同使用
2.get和post的异同
3.获取所有请求的参数enumeration
4.获取所有的参数信息,以map的形式
5.请求转发,请求转发,留头不留体rd.forward(request, response);
6.请求转发,和请求重定向的区别
7.请求上传
 */


//Get请求与Post请求的异同:
    /*
    1.GET请求和POST请求都是Http协议规定的请求方式之一
    GET请求更偏向于从服务器获取数据,而不会修改服务器中已有的数据
    POST请求更偏向于向服务器发送数据(修改服务器已有数据)
    2.GET请求请求参数拼接在URL后,使用?隔开
    POST请求请求参数放在请求体中
    但是无论哪种方式,参数的格式和内容都是一样的,每一个参数使用key=value的形式,多个参数之间使用&进行连接
    3.由于GET请求的参数是放在URL上的,又因为URL是有长度限制的,所以,GET请求不能发送过大的数据
    而POST请求,由于是参数放入请求体,就没有长度限制了,可以用来上传文件
    4.关于安全,GET和POST一样,都不安全,因为Http协议本身就是不安全的协议
     */
@WebServlet(name = "AServlet", urlPatterns = "/a")
public class AServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //对request和response的操作是不分get/post请求的(请求头)
        response.setContentType("text/html;charset=utf-8");
        //使用utf-8来解析body中对的参数(请求体)
        request.setCharacterEncoding("utf-8");
        //获取名字,密码,性别
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String gender = request.getParameter("gender");
        //要获取向checkbox这种一个name对应多个value的参数,需要使用该方法,返回值是String数组
        String[] hobbies = request.getParameterValues("hobby");
        //接收单值的时候,用的是getParameter,多值用的是getParameterValues
        PrintWriter pw = response.getWriter();
        pw.println("用户名:" + username);
        pw.println("密码:" + password);
        pw.println("性别:" + gender);
        pw.println("爱好:" + Arrays.toString(hobbies));
        //Arrays.toString(hobbies)把数组用字符串打印出来,两边还加上中括号

        //获取所有请求的参数
        //enumeration这个对象可以"像"resultSet一样使用
        //只有2个方法
        //hasMoreElements:是否还有没遍历的元素
        //nextElement:下一个元素
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String name = parameterNames.nextElement();
            pw.println(name);
        }
        //获取所有的参数信息,以map的形式
        //key就是参数的name
        //value就是参数的value
        Map<String, String[]> map = request.getParameterMap();
        //获取所有的key,组成一个set集合
        Set<String> keyset = map.keySet();
        for (String key : keyset) {
            //为了照顾像checkbox这样的多个value的情况,所以,value是一个数组
            String[] values = map.get(key);
            //输出看效果
            pw.println(key + "::" + Arrays.toString(values));
        }
        //迭代器遍历
//        Iterator<String> iterator = keyset.iterator();
//        while (iterator.hasNext()) {
//            String key = iterator.next();
    }
}
